/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package jcworks;

/**
 *
 * @author Manica
 */
public class KompozitElem extends Epitoelemek {

    protected Munkaterulet m;
    int beLabakSzama;
    int kiLabakSzama;
    private int szint=0;

    public KompozitElem(int be, int ki)
    {
        for(int i=0; i<be; i++) //bemeneti lábak létrehozása
        {
            m.alkatresz.add(new KompozitLab(i));
            KompozitLab temp=(KompozitLab) m.alkatresz.get(i);
            temp.setIrany(true);
        }
        for(int i=be; i<be+ki; i++) //kimeneti lábak létrehozása
        {
            m.alkatresz.add(new KompozitLab(i));
            KompozitLab temp=(KompozitLab) m.alkatresz.get(i);
            temp.setIrany(false);
        }
        beLabakSzama=be;
        kiLabakSzama=ki;
    }


    public void hozzaadDrot(Epitoelemek forrasElem, Epitoelemek celElem,Drot drot) throws Exception
    {
                //A drót bementi címe legyen az az elem, ahonnan jön a jel
                drot.setBemenetiCim(forrasElem);

                //irany => TRUE, ha bemenet, FALSE, ha kimenet.
                
                //A forráselem kiemeneti címe legyen a drót
                forrasElem.setDrotCim(drot, false);

                //A célelem bemeneti címe legyen a drót
                celElem.setDrotCim(drot, true);
    }

    public void hozzaadEpitoelem(Epitoelemek epitoelem)
    {
                m.alkatresz.add(epitoelem);
    }

    public void setDrotCim(Drot drotCim, boolean irany, int labAzon) throws Exception
    { //irany=1 akkor be, 0 akkor ki
            
            if(irany == true) //ha bemeneti láb, akkor bemenetként köti rá a lábra
            {
                m.alkatresz.get(labAzon).setDrotCim(drotCim, true);
            }
            else        //ha kimeneti, akkor kimenetként
                m.alkatresz.get(labAzon).setDrotCim(drotCim, false);

    }

    public void bokes() throws UresMunkateruletException {
            //if(Vezerlo.konzolnaplozas) Vezerlo.naplozas(Integer.toString(azonosito)+". azonositoju " + this.getClass() + " - bokes");
            this.step();

	}

    public void step() throws UresMunkateruletException
    {
                //Lekérjük az alkatrészlistát
                //ArrayList<Epitoelemek> alkatreszek = m.getAlkatreszLista();

                //Ha üres a munkaterület, dobunk exceptiontt :)
                if(m.alkatresz.isEmpty())
                    throw new UresMunkateruletException();


               //Addig böködjük az aktuális szintek elemeit, ameddig van nagyobb szint :)
               int      aktualisSzint = 0;
               boolean  vanMegSzint   = false;


                    //Addig iterálunk újra és újra végig az összes elemen míg van magasabb szintű elem, mint az aktuális szint
                    do{
                        vanMegSzint = false;

                        for(int i = 0;i < m.alkatresz.size();i++)
                                {
                                    int pillanatnyilagVizsgaltAlkatreszSzintje = m.alkatresz.get(i).getSzint();

                                    //Meghatarozzuk van-e elem a kovetkezo szinten
                                    if(pillanatnyilagVizsgaltAlkatreszSzintje == aktualisSzint+1)
                                        vanMegSzint = true;


                                    //Az aktualis szinten levo elemeket megbokjuk
                                    if(pillanatnyilagVizsgaltAlkatreszSzintje == aktualisSzint)
                                        try{
                                                m.alkatresz.get(i).bokes();
                                            }
                                        catch(Exception e)
                                        {
                                            //Vezerlo.naplozas("Hiba tortent a(z) " + m.alkatresz.get(i).getAzonosito() + ". elem bokesekor: " + e.getMessage(),"Hiba" );
                                            System.exit(1);
                                        }
                                }

                        aktualisSzint++;

                      } while(vanMegSzint);
    }

    public void clear() // "levágja a kompozit elemen kívülre eső drótokat"
    {
        for(int i=0; i<beLabakSzama+kiLabakSzama; i++)
        {
            KompozitLab temp=(KompozitLab) m.alkatresz.get(i);
            temp.clear();
        }
    }

}
